#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File  : book_modules.py
# @Author: Xuhao
# @Date  : 2018/3/15
# @Desc  :

from app.Sql.SQLSession import Base,DataBaseConnector
from sqlalchemy import Column, String, Integer,Text
import json
from sqlalchemy.ext.declarative import DeclarativeMeta
from datetime import datetime

class Feedback(Base):
    __tablename__ = 'book_feedback'
    __table_args__ = {"extend_existing": True}
    id = Column(Integer, primary_key=True, autoincrement=True)
    feedBackContent = Column(Text)
    feedBackreply = Column(Text)
    feedBackTitle = Column(Text)
    feedBackTime = Column(String(32))
    feddBackreplyTime = Column(String(32))

    @classmethod
    def add_feedback(cls, title, content):
        '''
        添加意见反馈
        :param title:  标题
        :param content: 内容
        :return: 
        '''

        connect = DataBaseConnector()

        session = connect.get_session()

        nowTime = datetime.now()
        new_feedback = Feedback(feedBackTitle=title,feedBackContent=content, feedBackTime=nowTime.strftime('%Y-%m-%d %H:%M:%S'))
        session.add(new_feedback)

        try:

            session.commit()
            connect.close()
        except Exception as e:
            connect.close()

    @classmethod
    def fetch_feedback(cls):
        '''
        获取意见反馈
        :return: 
        '''
        connect = DataBaseConnector()

        session = connect.get_session()
        ret = session.query(Feedback).all()
        return json.dumps(ret, cls=new_alchemy_encoder(False, ))

def new_alchemy_encoder(revisit_self=False, fields_to_expand=[]):
    _visited_objs = []

    class AlchemyEncoder(json.JSONEncoder):
        def default(self, obj):
            if isinstance(obj.__class__, DeclarativeMeta):
                # don't re-visit self
                if revisit_self:
                    if obj in _visited_objs:
                        return None
                    _visited_objs.append(obj)

                # go through each field in this SQLalchemy class
                fields = {}
                for field in [x for x in dir(obj) if
                              not x.startswith('_') and x != 'metadata' and hasattr(obj.__getattribute__(x),
                                                                                    '__call__') == False]:
                    val = obj.__getattribute__(field)

                    # is this field another SQLalchemy object, or a list of SQLalchemy objects?
                    if isinstance(val.__class__, DeclarativeMeta) or (
                                    isinstance(val, list) and len(val) > 0 and isinstance(val[0].__class__,
                                                                                          DeclarativeMeta)):
                        # unless we're expanding this field, stop here
                        if field not in fields_to_expand:
                            # not expanding this field: set it to None and continue
                            fields[field] = None
                            continue

                    fields[field] = val
                # a json-encodable dict
                return fields

            return json.JSONEncoder.default(self, obj)

    return AlchemyEncoder